public class code7 {
    public List<List<Integer>> threeSum(int[] nums) {
        //1.排序
        Arrays.sort(nums);

        List<List<Integer>> List = new ArrayList<>();
        //2.利用双指针解决问题

        for(int i=0;i<nums.length-2;) {//固定数a
            //优化：当第一个数都大于0，那么后面一定不存在
            if(nums[i]>0) break;
            int left=i+1,right=nums.length-1,target=-nums[i];
            List<Integer> list = new ArrayList<>();
            while(left<right) {
                if(nums[left]+nums[right]==target) {
                    List.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[left],nums[right])));
                    left++;
                    right--;
                    //去重:left right
                    while(left<right&&nums[left]==nums[left-1]) left++;
                    while(left<right&&nums[right]==nums[right+1]) right--;
                } else if(nums[left]+nums[right]<target) left++;
                else right--;
            }
            //去重：i
            i++;
            while(i<nums.length&&nums[i]==nums[i-1]) i++;
        }
        return List;
    }
}
